#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

#define N 10

//void RunChild()
//{
//    int cnt = 5;
//    while(1)
//    {
//        printf("i am child, pid:%d, ppid:%d\n",getpid(),getppid());
//        sleep(1);
//        cnt--;
//    }
//}


//////////// 
// 非阻塞轮询时，父进程在做自己的事情，那么都在做什么呢？

#define Task_Num 10
typedef void(*task_t)();
task_t tasks[Task_Num];

void task1(){ printf("这是一个打印日志的任务, pid:%d\n",getpid()); }
void task2(){ printf("这是一个执行检测网络健康状态的任务, pid:%d\n",getpid()); }
void task3(){ printf("这是一个进行绘制图形界面的任务, pid:%d\n",getpid()); }

void Init_Task(){
    for(int i = 0; i < Task_Num; ++i){ 
        tasks[i]=NULL; 
    }
    Add_Task(task1);
    Add_Task(task2);
    Add_Task(task3);
}

int Add_Task(task_t t){
    int pos = 0;
    for(; pos < Task_Num; ++pos){
        if(!tasks[pos]) break;
    }
    if(pos==Task_Num) return -1;
    tasks[pos] = t;
    return 0;
}

void Del_Task(){}
void Cheak_tesk(){}
void Updata_Task(){}

// 执行任务
void Execute_Task(){
    for(int i = 0; i < Task_Num; ++i)
    {
        if(!tasks[i]) continue;
        tasks[i]();
    }
}

int main()
{
//    // 多个子进程——等待
//    int i = 0;
//    for(i = 0;i < N; i++)
//    {
//        pid_t id = fork();
//        if(id==0)
//        {
//            // 子进程
//            RunChild();
//            exit(0);
//        }
//        printf("create child process:%d success\n",id);
//    }
//    sleep(10);
//    //等待
//    for(i = 0; i < N; i++)
//    {
//        pid_t id = wait(NULL);
//        if(id>0)
//        {
//            printf("wait %d success\n",id);
//        }
//    }


    // 一个子进程——等待
    pid_t id = fork();
    if(id<0)
    {
        perror("fork");
        return -1;
    }
    else if(id==0)
    {
        // child
        int cnt = 3;

        // int* p = NULL;
        while(cnt)
        {
            printf("i am child, pid:%d, ppid:%d, cnt:%d\n",getpid(),getppid(),cnt);
            sleep(1);
            cnt--;

            // int a = 1;
            // a /= 0;
            // *p = 100;
        }
        exit(1);
    }
    else
    {
        // parent
       // int cnt = 5;
       // while(cnt)
       // {
       //     printf("i am parent, pid:%d, ppid:%d, cnt:%d\n",getpid(),getppid(),cnt);
       //     sleep(1);
       //     cnt--;
       // }
        //pid_t ret = wait(NULL);
        //pid_t ret = waitpid(-1, NULL, 0);
        int status = 0;
        
        Init_Task();

        while(1)    // 轮询
        {
           //  pid_t ret = waitpid(id, &status, 0);
            pid_t ret = waitpid(id, &status, WNOHANG);  // 非阻塞
            if(ret > 0)
            {
               // printf("wait success, ret:%d, exit sig:%d, code sig:%d\n",ret,status&0x7F, (status>>8)&0xFF);
                if(WIFEXITED(status))
                {
                    printf("进程正常跑完的，退出码:%d\n",WEXITSTATUS(status));
                }
                else{
                    printf("进程出现了异常\n");
                }
                break;
            }
            else if(ret < 0){
                printf("等待失败\n");
                break;
            }
            else{
                // printf("还没有好吗？我在等等\n");
                // sleep(1);
                
                Execute_Task();
                usleep(500000);
            }
        }
        sleep(3);
    }

    return 0;
}
